package error_demo

import (
	"errors"
	"fmt"
	"os"
	"reflect"
	"time"
)

func LoadFile() {
	file, err := os.ReadFile("d:/1231.txt")
	//针对err进行错误处理
	if err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println(string(file))
	}
}

func CreateError() {
	err := errors.New("这是一个自定义错误")
	fmt.Println(err, reflect.TypeOf(err))
	err2 := fmt.Errorf("fmt自定义错误:%s", "自定义内容")
	fmt.Println(err2, reflect.TypeOf(err2))
	res, err3 := divide(1, 0)
	if err3 != nil {
		fmt.Println(err3)
	} else {
		fmt.Println(res)
	}
}

func divide(i1, i2 float64) (res float64, err error) {
	fmt.Println("计算数据:", i1, i2)
	if i2 == 0 {
		return 0, errors.New("除数不能为0")
	}
	res = i1 / i2
	return res, nil
}

func PanicDemo() {
	database, err := connectDatabase("", 0)
	for {
		time.Sleep(1 * time.Second)
		if err != nil {
			//fmt.Println(err)
			panic(err)
		} else {
			fmt.Println(database)
		}
	}
}

func connectDatabase(address string, port int) (string, error) {
	if address == "" || port == 0 {
		return "", errors.New("地址或接口参数异常")
	}
	return "链接成功", nil
}

func DeferDemo() {
	database, err := connectDatabase("", 0)
	defer fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
	defer closeDatabase()
	if err != nil {
		fmt.Println(err)
		panic(err)
	} else {
		fmt.Println(database)
	}
}

func closeDatabase() {
	fmt.Println("关闭数据库链接")
}

func RecoverDemo() {
	s := []string{"1", "2"}
	printSliceData(s)
}

func printSliceData(s []string) {
	defer func() {
		fmt.Println("执行defer")
		if err := recover(); err != nil {
			fmt.Println("捕获到一个异常", err, reflect.TypeOf(err))
			//发出一个告警or记录一个日志or返回给前端异常信息
		}
	}()

	fmt.Println(s)
	fmt.Println(s[2])
}

func ErrorCheckDemo() {
	barCodeList := []string{"1", "2", "3", "4", "5"}
	defer func() {
		fmt.Println("回收资源")
		if err := recover(); err != nil {
			fmt.Println("自定义异常处理：", "记录日志")
			fmt.Println(err)
		}
	}()

	fmt.Println(barCodeList)
	fmt.Println(barCodeList[5])
}
